﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "GcmpModelInterface.h"
#include "IExternalObject.h"
#include "OwnerPtr.h"
#include "NdbDataSchema.h"
#include "ElementCreationOptions.h"
#include "GraphicsRenderLayer.h"
#include "IVisibilityTypeFlags.h"

namespace gcmp
{
    class ICurve2d;
    class ICurve3d;
    class IExternalDatas;

    /// \brief 模型线的接口。模型线支持两种类型，一种是有关联平面的，模型线在关联平面上，平面移动时会随平面移动；
    /// 另一种是直接由三维空间点确定的模型线。
    class GCMP_MODEL_INTERFACE_EXPORT IModelLine : public IExternalObject
    {
        DECLARE_CLASS_WITHOUT_DATA_MEMBERS(gcmp, IModelLine, gcmp::IExternalObject, 17A37480 - F384 - 4976 - A6EB - C1AA6092975B, gcmpmodelinterface)
    public:
        /// \brief 析构函数。
        virtual ~IModelLine();
#pragma region Static
        /// \brief 获取所有模型线。
        /// 获取所有模型线的指针。
        /// \param pDoc 文档指针。
        /// \return 返回模型线的接口指针数组。
        static std::vector<IModelLine*> GetAllModelLines(const IDocument* pDoc);

        /// \brief 获取所有模型线Id。
        /// 获取取所有模型线的Id。
        /// \param pDoc 文档指针。
        /// \return 返回模型线的ElmentId数组。
        static std::vector<ElementId> GetAllModelLineIds(const IDocument* pDoc);

        /// \brief 创建有关联平面的模型线。
        /// \param pDoc 文档指针。
        /// \param planeId 模型线的关联平面。
        /// \param pCurve 模型线的几何数据。
        /// \return 返回一个模型线的接口指针。
        static IModelLine* Create(
            IDocument* pDoc,
            const ElementId& planeId,
            OwnerPtr<ICurve2d> opCurve,
            ElementCreationOptions eco = ElementCreationOptions::Normal);

        /// \brief 创建无关联平面的模型线。
        /// \param pDoc 文档指针。
        /// \param opCurve 模型线的几何数据。
        /// \return 返回一个模型线的接口指针。
        static IModelLine* Create(
            IDocument* pDoc,
            OwnerPtr<ICurve3d> opCurve,
            ElementCreationOptions eco = ElementCreationOptions::Normal);
#pragma endregion Static

        /// \brief 获取模型线的几何曲线。
        /// \return 返回模型线的几何曲线指针。
        virtual OwnerPtr<ICurve3d> GetGeometryCurve() const = 0;

        /// \brief 设置模型线的几何曲线。
        /// \param upPlane 新的几何曲线。
        /// \return 如果设置成功返回true；否则返回false。
        virtual bool SetGeometryCurve(OwnerPtr<ICurve3d> upCurve) = 0;

        /// \brief 获取模型线的样式Id。
        /// \return 返回模型线的样式的Id。
        virtual ElementId GetGraphicsStyleId() const = 0;

        /// \brief 设置模型线的样式。
        /// \param id 新的样式Id
        /// \return 如果设置成功返回true；否则返回false。
        virtual bool SetGraphicsStyleId(const ElementId& id) = 0;

        /// \brief 获取模型线是否为直线。
        /// \return 如果模型线是直线，返回true；否则返回false。
        virtual bool IsStraightLine() const = 0;

        /// \brief 获取模型线是否为圆弧。
        /// \return 如果模型线是圆弧，返回true；否则返回false。
        virtual bool IsArc() const = 0;

        /// \brief 获取模型线是否为椭圆弧。
        /// \return 如果模型线是椭圆弧，返回true；否则返回false。
        virtual bool IsEllipse() const = 0;

        /// \brief 设置模型线是否草图辅助线类别
        /// 只有在三维草图绘制或者编辑模式中，才能进行模型线和草图辅助线的互转
        /// \param value true 表示设置成草图辅助线类别，false表示设置成普通模型线类别
        /// \return 设置返回true, 否则返回false
        virtual bool SetIsSketchReferenceLine(bool value) = 0;

        /// \brief 获取当前模型线是否草图辅助线
        /// \return 如果是草图辅助线类别，返回true，否则返回false
        virtual bool IsSketchReferenceLine() const = 0;

        /// \brief 获取渲染层次类型，默认（Model）模型层，与一般对象存在遮挡关系
        /// \return 渲染层次类型，参见：GraphicsRenderLayer
        /// \see GraphicsRenderLayer
        virtual GraphicsRenderLayer GetRenderLayer() const = 0;

        /// \brief 设置渲染层次类型
        /// \param renderLayer 渲染层次类型，参见：GraphicsRenderLayer
        /// \return 无
        /// \see GraphicsRenderLayer
        virtual void SetRenderLayer(GraphicsRenderLayer renderLayer) = 0;

        /// \brief 得到关联平面id
        /// \return 关联平面id
        virtual ElementId GetAssociatedPlaneId() const = 0;

        /// \brief 设置关联平面id
        /// \param id 关联平面id
        /// \return 返回true表示成功设置，否则表示失败 
        virtual bool SetAssociatedPlaneId(const ElementId &id) = 0;

        /// \brief 获得ModelLine的所有外部扩展数据
        /// 
        /// \return ModelLine的所有外部扩展数据
        virtual const IExternalDatas* GetExternalDatas() const = 0;

        /// \brief 获得ModelLine的所有外部扩展数据
        /// 
        /// \return ModelLine的所有外部扩展数据
        virtual IExternalDatas* GetExternalDatas() = 0;

        /// \brief 获取可见性标记的非const指针,用户可通过操作此返回值对可见性进行修改
        ///
        /// \return 返回可见性标记的非const指针
        virtual IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() = 0;

        /// \brief 获取可见性标记的const指针
        ///
        /// \return 返回可见性标记的const指针
        virtual const IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() const = 0;

        /// \brief 模型线是否被视图范围裁剪
        ///
        /// \return 被视图范围裁剪返回true，否则返回false。
        virtual bool IsCuttableByModelViewRange() const = 0;

        /// \brief 设置模型线是否被视图范围裁剪
        /// 
        /// \param isCuttable 是否可被视图范围裁剪
        /// \return 无
        virtual void SetCuttableByModelViewRange(bool isCuttable) = 0;

        /// \brief 获取Implementation Uid
        ///
        /// \return UniIdentity 返回ImplementationUid
        static UniIdentity GetImplementationUid();

        /// \brief 设置是否使用类别样式
        /// \param isUseCategoryStyle 是否使用
        /// \return 无。
        virtual void SetIsUseCategoryStyle(bool isUseCategoryStyle) = 0;

        /// \brief 获取倒角斜线Id
        ///
        /// \return 倒角斜线Id
        virtual gcmp::ElementId GetChamferPointId() const = 0;

        /// \brief  设置倒角斜线Id
        ///
        /// \param  chamferPointId 倒角斜线Id
        virtual void SetChamferPointId(const gcmp::ElementId& chamferPointId) = 0;

        /// \brief 获得主对象（模型线）Id
        /// 主对象指具有强依赖关系的对象，当主对象被删除时，从对象也会被删除。
        ///
        /// \return ElementId 主对象（模型线）的Id
        virtual gcmp::ElementId GetMasterCurveId() const = 0;

        /// \brief 设置主对象（模型线）Id
        /// 主对象指具有强依赖关系的对象，当主对象被删除时，从对象也会被删除。
        ///
        /// \param masterId 主对象（模型线）Id
        /// \return void
        virtual void SetMasterCurveId(gcmp::ElementId masterCurveId) = 0;

        /// \brief 获取可见性标记
        /// 
        /// \return 标记值
        GCMP_OBSOLETE_API(2020/09/01, IModelLine::GetVisibilityTypeFlagsInHostDocument() const ) virtual UInt32 GetVisibilityInHostDocument() const = 0;

        /// \brief 设置可见性标记
        /// 
        /// \param flag 标记值
        GCMP_DEPRECATED_API(2020/09/01) virtual bool SetVisibilityInHostDocument(UInt32 flag) = 0;
    };
}



